"""
服务基类，提供事件处理和监听器管理功能
"""
import traceback
from typing import Dict, List, Callable, Any


class Event:
    """
    事件类，表示一个事件
    """
    
    def __init__(self, event_type: str, data: Any = None):
        """
        初始化事件
        
        @param event_type: 事件类型
        @param data: 事件数据
        """
        self.event_type = event_type
        self.data = data
    
    def __str__(self) -> str:
        """
        返回事件的字符串表示
        
        @return: 字符串表示
        """
        return f"Event(type='{self.event_type}', data={self.data})"


class BaseService:
    """
    服务基类，提供事件处理和监听器管理功能
    """
    
    def __init__(self):
        """
        初始化服务基类
        """
        # 事件监听器字典，键为事件类型，值为监听器列表
        self._listeners: Dict[str, List[Callable[[Event], None]]] = {}
    
    def add_listener(self, event_type: str, listener: Callable[[Event], None]) -> None:
        """
        添加事件监听器
        
        @param event_type: 事件类型
        @param listener: 监听器函数，接收一个 Event 参数
        """
        if event_type not in self._listeners:
            self._listeners[event_type] = []
        
        if listener not in self._listeners[event_type]:
            self._listeners[event_type].append(listener)
    
    def remove_listener(self, event_type: str, listener: Callable[[Event], None]) -> bool:
        """
        移除事件监听器
        
        @param event_type: 事件类型
        @param listener: 监听器函数
        @return: 是否成功移除
        """
        if event_type in self._listeners and listener in self._listeners[event_type]:
            self._listeners[event_type].remove(listener)
            return True
        return False
    
    def clear_listeners(self, event_type: str = None) -> None:
        """
        清除事件监听器
        
        @param event_type: 事件类型，如果为 None 则清除所有监听器
        """
        if event_type is None:
            self._listeners.clear()
        elif event_type in self._listeners:
            self._listeners[event_type].clear()
    
    def notify(self, event_type: str, data: Any = None) -> None:
        """
        通知事件
        
        @param event_type: 事件类型
        @param data: 事件数据
        """
        # 创建事件对象
        event = Event(event_type, data)
        
        # 调用监听器
        if event_type in self._listeners:
            for listener in self._listeners[event_type]:
                try:
                    listener(event)
                except Exception as e:
                    # 添加日志记录和堆栈追踪
                    print(f"事件监听器异常: {str(e)}")
                    traceback.print_exc()
    
    def shutdown(self) -> None:
        """
        关闭服务
        
        子类应该重写此方法以实现自己的关闭逻辑
        """
        # 清除所有监听器
        self.clear_listeners() 